package part15exceptionhandle;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * @description: 重写ThreadPoolExecutor.afterExecute方法，处理传递的异常引用
 */
public class Test01 {

    public static void main(String[] args) {
        // 创建自定义的线程池执行器
        CustomThreadPoolExecutor executor = new CustomThreadPoolExecutor(
                2, // 核心线程数
                4, // 最大线程数
                60L, // 线程空闲时间
                java.util.concurrent.TimeUnit.SECONDS, // 时间单位
                new LinkedBlockingQueue<>() // 任务队列
        );

        // 提交任务
        for (int i = 0; i < 10; i++) {
            executor.execute(() -> {
                System.out.println(Thread.currentThread().getName() + " 执行任务");
                throw new RuntimeException(Thread.currentThread().getName() + " 任务执行异常");
            });
        }

        // 关闭线程池
        executor.shutdown();
    }

}



class CustomThreadPoolExecutor extends ThreadPoolExecutor {

    public CustomThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, java.util.concurrent.TimeUnit unit, java.util.concurrent.BlockingQueue<Runnable> workQueue) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
    }

    @Override
    protected void afterExecute(Runnable r, Throwable t) {
        super.afterExecute(r, t);
        if (t != null) {
            // 在这里处理传递的异常引用
            System.err.println("任务执行出现异常: " + t.getMessage());
            // 这里你可以进行异常处理，比如记录日志或者执行其他操作
        }
    }
}